iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
AI/ ML & Data

自動交易程式探索系列 第 3

Day 3 - Yahoo Finance API抓取資料,FinRL特徵工程

  • 分享至 

  • xImage
  •  

數據的取得非常重要,在正式開始學習FinRL教學範例之前,先直接調用Yahoo Finance,嘗試獲取之後可以用於訓練的股票價格資料。

使用 yfinance 抓取 S&P 500 的 15 分鐘資料

下面是一個具體範例,從 Yahoo Finance 下載 S&P 500 指數在指定兩天內的每 15 分鐘的歷史資料。
這些數據將包括開盤價(Open)、最高價(High)、最低價(Low)、收盤價(Close)、調整後的收盤價(Adj Close)以及成交量(Volume)。

  • start_dateend_date: 我們選擇了 2 天的日期範圍,這適合使用 15m 這樣的高頻資料。
  • interval: 15m 代表每 15 分鐘抓取一次資料,適合短期交易分析。

intervals 參數

參考yf.download的定義註解

  • Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo Intraday data cannot extend last 60 days

一開始嘗試抓取 2023-08-01 ~ 2023-08-02 被拒絕
YFPricesMissingError('$%ticker%: possibly delisted; no price data found (15m 2023-08-01 -> 2023-08-02) (Yahoo error = "15m data not available for startTime=1690862400 and endTime=1690948800. The requested range must be within the last 60 days.")')

import yfinance as yf
import pandas as pd

# 設定參數
start_date = '2024-08-01'  # 設定開始日期
end_date = '2024-08-02'    # 設定結束日期
interval = '15m'            # 設定時間週期為 15 分鐘

# 抓取 S&P 500 數據
ticker = '^GSPC'  # Yahoo Finance 中 S&P 500 的代號
sp500_data = yf.download(ticker, start=start_date, end=end_date, interval=interval)

# 顯示數據
print(sp500_data.head())

使用 yfinance 一次抓取多隻股票的資料

import yfinance as yf
import pandas as pd

# 設定參數
start_date = '2024-08-01'  # 設定開始日期
end_date = '2024-08-02'    # 設定結束日期
interval = '15m'            # 設定時間週期為 15 分鐘

# 設定多支股票的代號
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'TSLA']  # 股票代號

# 抓取多支股票的數據
data = yf.download(tickers, start=start_date, end=end_date, interval=interval, group_by='ticker')

# 顯示數據
for ticker in tickers:
    print(f"--- {ticker} ---")
    print(data[ticker].head())
    print("\n")

使用 FinRL 進行特徵工程

股市中有很多常見的指標,這些技術指標像是移動平均收斂散度(MACD)、相對強弱指數(RSI)等等。因為很多人使用這些指標,導致股票的波動很多時候會對這些指標有反應,因此在訓練時,可以考慮將這些指標做為特徵丟給網路當作輸入;這邊使用FinRL的API可以很輕鬆地取得這些指標數值來做特徵工程。

步驟 1: 做特徵工程前對,數據格式做預處理

在應用特徵工程之前,我們需要對數據進行一些預處理步驟,包括添加必要的欄位並將欄位名稱轉換為小寫,以符合 FeatureEngineer 的預期格式。

在進行特徵工程之前,我們需要確保數據框包含 datetic 欄位。date 欄位用來表示時間戳,而 tic 欄位用來表示股票的代號。

# 添加必要的欄位
sp500_data = sp500_data.reset_index()  # 重設索引,將日期移到普通欄位
sp500_data['date'] = sp500_data['Datetime']  # 添加 'date' 欄位
sp500_data['tic'] = '^GSPC'  # 添加 'tic' 欄位,這裡 '^GSPC' 是 S&P 500 的代號

# 移除原本的 'Datetime' 欄位
sp500_data = sp500_data.drop(columns=['Datetime'])

# 將所有欄位名稱轉為小寫,以符合 FeatureEngineer 的預期格式
sp500_data.columns = [col.lower() for col in sp500_data.columns]

# 顯示處理後的數據
print(sp500_data.head())

步驟 2: 使用 FeatureEngineer 進行特徵工程

現在我們可以使用 FeatureEngineer 來添加技術指標並進行特徵工程。

from finrl.meta.preprocessor.preprocessors import FeatureEngineer

# 定義我們要使用的技術指標
INDICATORS = ['macd', 'rsi', 'cci', 'dx']

# 初始化 FeatureEngineer
fe = FeatureEngineer(use_technical_indicator=True, tech_indicator_list=INDICATORS)

# 將技術指標應用於 S&P 500 的數據
sp500_data_with_indicators = fe.preprocess_data(sp500_data)

# 顯示結果
print(sp500_data_with_indicators.head())

特徵工程的輸出

經過特徵工程處理後,我們的數據集將包含原始的 OHLCV 資料以及計算出的技術指標。

範例輸出:

          open         high          low        close    adj close     volume                date    tic      macd  rsi         cci          dx
0  5537.839844  5564.850098  5537.839844  5563.870117  5563.870117  103701490 2024-08-01 09:30:00  ^GSPC  0.000000  0.0   66.666667  100.000000
1  5563.919922  5566.160156  5552.790039  5556.890137  5556.890137  127984568 2024-08-01 09:45:00  ^GSPC -0.156602  0.0   66.666667  100.000000
2  5556.299805  5559.220215  5536.430176  5537.759766  5537.759766  133276389 2024-08-01 10:00:00  ^GSPC -0.792774  0.0 -100.000000   87.020657

上一篇
Day 2 - 透過FinRL範例學習DRL (安裝環境: Windows)
下一篇
Day 4 - 透過FinRL入門 Data (1/3)
系列文
自動交易程式探索12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言